package com.weiyuwqj.server.mapper;

import com.weiyuwqj.api.model.BasItem;
import com.weiyuwqj.api.model.BusItemInvest;
import com.weiyuwqj.api.model.vo.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Repository
public interface BusItemInvestMapper extends Mapper<BusItemInvest> {

    List<BusItemInvestVo> getInvestList(Map<String, Object> map);

    Map<String, Object> totalInvest(Map<String, Object> map);

    /**
     * 根据项目id查询投资列表
     * @param itemId
     * @return
     */
    List<BusItemInvest> getInvestListByItemId(Integer itemId);

    //显示&查询
    List<BusItemInvestVo> getList(Map<String, Object> param);

    List<BusItemInvestVo> getInvestByItemId(Integer itemId);

    Map<String, Object> getOne(Integer itemId);

    //总投资人数
    int totalUserInvests();

    //首页-投资人数统计
    List<Map<String,Object>> getRegionGroupCountInvestUserList(Map<String, Object> map);

    Map<String,Object> getRegionCountInvestUserList(Map<String, Object> map);

    //首页-投资金额统计
    List<Map<String, Object>> getRegionGroupInvestAmountList(Map<String, Object> map);

    Map<String, Object> getRegionInvestAmountList(Map<String, Object> map);

    List<Map<String, Object>> getInvestItemList(Map<String, Object> map);

    void insertInvest(BusItemInvest invest);


    int updateItemInvestStatus(@Param("oldStatus") Integer oldStatus,
                               @Param("newStatus") Integer newStatus,
                               @Param("id") Integer id);

    int updateItemFullInvestCollet(@Param("operPrincipal") BigDecimal operPrincipal,
                                   @Param("operInterest") BigDecimal operInterest,
                                   @Param("id") Integer id,
                                   @Param("investAdditionalRateAmount") BigDecimal investAdditionalRateAmount);

    int updateItemRepayInvestCollet(@Param("operPrincipal") BigDecimal operPrincipal,
                                    @Param("operInterest") BigDecimal operInterest,
                                    @Param("id") Integer id);
    //统计待收总金额
    Double sumInvestAccount();

    //统计待收本金
    Double sumInvestPrincipal();

    //统计待收利息
    Double sumInvestInterest();

    //4-18-4-30日活动统计sql
    BigDecimal countAmount(Map<String, Object> map);

    //查询个人某时间投资记录4条
    List<Map> getListByUserIdAndTime(Map map);

    //个人投资记录
    List<BusItemInvest> getListByUserId(Integer userId);

    //项目中第一个投资人
    Integer getFirstInvestByItemId(Map map);
    //项目中最后一个投资人
    Integer getLastInvestByItemId(Map map);
    //项目中投资最多的人
    Integer getTopInvestByItemId(Map map);
    //查询当前项目是否有人投资
    List<Map> getListByItemId(Map map);
    //查询最高投资人的记录
    BusItemInvest getOneRecordByItemId(Map map);
    //修改特殊标识
    int updateSpecialMarks(@Param("newspecialMarks") String newspecialMarks,
                           @Param("oldspecialMarks") String oldspecialMarks,
                           @Param("userId") Integer userId);

    //后台首页昨日今日成交量统计
    Map countInvestAmountByTime();
    //后台首页统计用户投资人数，及人次
    Map countInvestNum();

    //根据用户id统计
    Map countInvestByUserId(Integer userId);

    //统计未复审项目的投资金额
    BigDecimal countAmountByStatusAndUserId(Map map);

    //后台首页趋势图
    List<Map> getRegionGroupCountInvestList(Map map);

    //APP统计所有投资资金
    BigDecimal sumInvestAmount();

    BusItemInvest getByOrderId(@Param("orderId")String orderId);

    //根据userId和autoId查询最早一条投资记录
    BusItemInvest getOneByUserIdAndAutoId(Map map);

    //根据时间查询投资
    List<BusItemInvestVo> listByTime(Map map);

    //根据userId和投资类型查询列表
    List<BusItemInvest> getListByUserIdAndType(Map map);

    BigDecimal statTotalAmount(Map investMap);

    List<InvestStatVo> monthlyStat(Map map);

    InvestDetailVo getInvestById(Integer investId);

    //根据userId统计使用加息券的金额
    BigDecimal countAddRateAmountByUserId(Integer userId);

    //根据userId统计当天投资的金额
    BigDecimal countTodayInvestMoney(Map map);

    //根据自动投标规则id查询投资记录
    Integer countInvestByStatus(Integer autoId);

    //根据自动投标规则id查询最早复审的时间
    Map getItemFullDateByAutoId(Integer autoId);

    Date querySuccessTimeByItemId(Integer itemId);

    /**
     * 根据userId查询可债权的投资记录
     * @param userId
     * @return
     */
    List<BusItemInvestVo> getCanDebtInvestList(Integer userId);

    /**
     * 根据id修改投资是否已债权
     * @param newStatus
     * @param oldStatus
     * @param id
     * @return
     */
    Integer modifyDebtInvestStatusById(@Param("newStatus")Integer newStatus,@Param("oldStatus")Integer oldStatus,@Param("id")Integer id);

    /**
     * 根据订单号修改投资状态
     * @param newStatus
     * @param oldStatus
     * @param orderNo
     * @return
     */
    Integer modifyInvestStatusByOrderNo(@Param("newStatus")Integer newStatus,@Param("oldStatus")Integer oldStatus,@Param("orderNo")String orderNo);

    /**
     * 根据订单号修改冻结流水号
     * @param freezeOrderNo
     * @param orderNo
     * @return
     */
    Integer modifyInvestFreezeOrderNo(@Param("freezeOrderNo")String freezeOrderNo,@Param("orderNo")String orderNo);

    /**
     * 根据userId查询所有投资记录
     * @param userId 用户ID
     * @return 投资记录
     */
	List<BusItemInvestVo> getAllDebtInvestList(@Param("userId") Integer userId);

    //根据id获取item
    BasItem getItemById(@Param("investId")Integer investId);

    /**
     * 根据投资id查询详情
     * @param investId
     * @return
     */
    DebtDetailVo getInvestByInvestId(Integer investId);

    /**
     * 个人中心投资记录：标投资记录，包投资记录，债权投资记录
     * @param userId
     * @return
     */
    List<InvestSetVO> getInvestSetList(Integer userId);
}